﻿using System.Collections.Generic;
using System.Data.Objects;
using System.Linq;

namespace RazakiBLL
{
    /// <summary>
    /// Generic Repository
    /// </summary>
    /// <typeparam name="TEntity"></typeparam>
    public class RpsRazaki<TEntity> where TEntity : class
    {

        #region >>>CONSTRUCTOR<<<

        public RpsRazaki(ObjectContext context)
        {
            _objectSet = context.CreateObjectSet<TEntity>();
        }

        #endregion

        #region >>>FIELD<<<

        protected ObjectSet<TEntity> _objectSet;

        #endregion

        #region >>>PRIMARY METHOD<<<

        public void Add(TEntity newEntity)
        {
            _objectSet.AddObject(newEntity);
        }

        public void Remove(TEntity entity)
        {
            _objectSet.DeleteObject(entity);
        }

        public virtual List<TEntity> GetAll()
        {
            return _objectSet.ToList();
        }

        #endregion

        #region >>>SECONDARY METHOD<<<

        /// <summary>
        /// در صورت لزوم می توان این متد را 
        /// override
        /// کرد و از فراخوانی متد 
        /// protected TEntity GetById(object id, string idKeyName)
        /// استفاده کرد.
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public virtual TEntity GetById(object id)
        {
            return GetById(id, "Id");
        }

        //فعلا لازم نیست.
        //public IQueryable<TEntity> GetAllAsQuery()
        //{
        //    return _objectSet;
        //}

        public void RemoveById(object id)
        {
            //اگر کلاس فرزند متد 
            //GetById
            //را
            //override
            //کرده باشد. متد کلاس فرزند صدا زده می شود
            TEntity entity = GetById(id);

            Remove(entity);
        }

        protected TEntity GetById(object id, string idKeyName)
        {
            string predicate = string.Format("it.{0} = @Id", idKeyName);
            ObjectParameter[] objectParameters = new[] { new ObjectParameter("Id", id) };

            return _objectSet.Where(predicate, objectParameters).SingleOrDefault();
        }

        #endregion

    }
}
